// pages/publicShareDetail/index.ts
import { createShareAppMessageInfo, handleCode, handleErrCode } from "../../utils/util";
import { showShareState, taskExecuteIsSysUserRead, taskExecuteReadTime, taskExecuteShareRead } from "../../service/api/api-promotion";
import { DEFAULT_CODE } from "../../utils/enmu";

Page({

  /**
   * 页面的初始数据
   */
  data: {
    task: {},// 当前的任务内容对象
    url: '',// 目标地址
    timer: 0,// 纪录阅读时间的计时器
    times: 0,// 纪录阅读时间数量
    percentage: 0,// 纪录阅读时间数量
    countdown: 0,// 倒计时
    shareAccountId: '',// 第一个分享人的id
    isDemandShareRead: false,// 是否要执行分享阅读
    showTimer: false,// 是否显示右侧计时器
    showShare: false,// 是否显示分享按钮
    currentReadUser: {},// 当前阅读的用户信息
    options: {},// 传入option
    wxCodes: [],// 之前一些分享用户的前辈信息，[]
    dropdownShow: false,// 是否显示底部分享
    isPromoterAccount: false,// 当前进入是否是发起人
    ShareReadData: '',// 接口请求的返回数据
    curColor: '#FF814A',// 当前的颜色
    // curColor: '#389E0D',// 当前的颜色
    curFont: 20,// 当前字体大小
    onWebViewLoadOver: false,// webview是否加载完成
    isSysUser: false,// 是否是系统用户
    showStatusTag: true,//标签是否显示
    statusText: '',//标签文字
    statusTagClass: '',//标签样式
    // 新增状态
    showPageContent: false,          // 控制是否显示页面内容
    notificationVisible: false,      // 同步通知组件的可见状态
    userId: ''
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    // wx.hideHomeButton();// 隐藏左上角小房子
    const { url, wxCodes, shareAccountId, task: data } = options;
    const task = JSON.parse(decodeURIComponent(data))
    this.setData({
      options,
      url,
      shareAccountId,
      task,
      isDemandShareRead: task.isDemandShareRead === 1,
      wxCodes: JSON.parse(wxCodes)
    })

  },
  showFullUserId() {
    wx.showModal({
      title: '完整用户ID',
      content: this.data.userId,
      showCancel: false
    });
  },
  // 处理通知可见性变化
  handleNotificationVisibility(e) {
    const { visible } = e.detail;

    this.setData({
      notificationVisible: visible,
      showPageContent: !visible // 如果通知不可见，则显示页面内容
    });

    if (!visible) {
      // 当通知不可见时，初始化页面
      const _that = this;
      setTimeout(() => {
        _that.setData({
          showShare: true,
        })
        _that.curReadUserCheck();// 请求一下，分享阅读接口
      }, 1000)
    }
  },

  /**
   * 页面加载成功时
   */
  onWebViewLoad(e) {
    console.log('onWebViewLoad', e);
    // 开始计时
    this.setData({
      onWebViewLoadOver: true
    })
    this.startCountDownCheck() && this.tikTokFun()
  },

  /**
   * 判断是否可以开始计时
   * 是新媒连心桥发起人(因为是发起人，就不会是管理员，并且是系统用户)，webview加载成功，两个个条件
   */
  startCountDownCheck() {
    return this.data.isPromoterAccount && this.data.onWebViewLoadOver
  },

  /**
   * 时间计时器
   */
  async tikTokFun(loop = false) {
    const { data: { task, timer, times } } = this;
    clearTimeout(timer);
    let _that = this;
    if (task.executeReadTime) {// 已经统计过一次读文章
      return
    }
    if (task && task.isDemandReadTime !== null && typeof task.isDemandReadTime !== "undefined") {
      this.setData({
        showTimer: true,
        eachTime: 100 / task.isDemandReadTime
      })
      if (times >= task.isDemandReadTime) {// 计时统计完了，调用接口通知一下后台
        clearTimeout(timer);
        _that.setData({
          curColor: '#389E0D',// 完成绿色
          curFont: 14,
          countdown: '完成',
        })
        // 1.5s后隐藏计时器
        setTimeout(() => {
          _that.setData({
            showTimer: false,
          })
        }, 1500)
        await taskExecuteReadTime({
          taskId: task.id,
        }).then(res => {
          handleCode(res, '阅读任务完成');
        }).catch(e => {
          console.warn(e);
          handleErrCode('计时失败')
        }).finally(() => {
          _that.setData({
            timer: null,
            times: 0,
            percentage: 0,
            countdown: 0,
          })
        })
      } else {
        // 初次设置一下初始值
        if (!loop) {
          this.setData({
            countdown: task.isDemandReadTime,
            percentage: 0,
          })
        }
        // 继续计时
        this.data.timer = setTimeout(() => {
          let newVal = _that.data.times + 1;
          let countdown = task.isDemandReadTime - newVal;
          let percentage = Number(((newVal / task.isDemandReadTime) * 100).toFixed(0));
          // console.log(newVal);
          // console.log(countdown);
          // console.log(percentage);
          _that.setData({
            times: newVal,
            percentage,
            countdown
          })
          _that.tikTokFun(true)
        }, 1000)
      }
    } else {
      console.warn('task.isDemandReadTime is null or undefined')
    }
  },

  /**
   * 判断当前进入用户是否是系统用户
   */
  async checkUserFun() {
    let _that = this;
    // 执行搜索函数
    const { globalData: { currentReadUser = {} } } = getApp();
    await taskExecuteIsSysUserRead({
      readWxampCode: currentReadUser.code || DEFAULT_CODE,// 当前阅读人
    }).then(async (res) => {
      console.log('判断是否系统用户');

      const { isUserAccount, userAccountId, userUnregisteredAccountId } = res.data || {};
      const isSysUser = isUserAccount === 1;// 等于1就是系统用户
      const App = getApp();
      App.globalData.isSysUser = isSysUser;// 存到全局
      if (!isSysUser) {
        console.warn('===== not sysUser=====')
        wx.hideHomeButton();// 隐藏左上角小房子
      }
      _that.setData({
        isSysUser,
        userId: userAccountId
      })
      _that.data.isDemandShareRead && _that.promoterFun({ isUserAccount, userAccountId, userUnregisteredAccountId });// 去执行分享阅读
    }).catch(error => {
      handleErrCode(error, 'none')
      wx.hideHomeButton();// 隐藏左上角小房子
    }).finally(() => {
    })
  },


  /**
   * 页面加载失败时
   */
  onWebViewError(e) {
    console.log(e);
    handleErrCode('获取失败')
  },

  /**
   * 检查一下当前阅读的用户是否存在，不存在重新获取一下
   */
  curReadUserCheck() {
    const App = getApp();
    let { globalData: { currentReadUser = {} } } = App;
    if (currentReadUser.code) {
      this.checkUserFun()
    } else {
      wx.login({
        success: res => {
          App.globalData.currentReadUser = { code: res.code };// 存一下当前阅读的用户信息
          this.checkUserFun()
        },
      })
    }
  },

  /**
   * 判断当前进入用户是否是系统用户
   */
  async checkUserFun() {
    let _that = this;
    // 执行搜索函数
    const { globalData: { currentReadUser = {} } } = getApp();
    await taskExecuteIsSysUserRead({
      readWxampCode: currentReadUser.code || DEFAULT_CODE,// 当前阅读人
    }).then(async (res) => {
      const { isUserAccount, userAccountId, userUnregisteredAccountId } = res.data || {};
      const isSysUser = isUserAccount === 1;// 等于1就是系统用户
      const App = getApp();
      App.globalData.isSysUser = isSysUser;// 存到全局
      if (!isSysUser) {
        console.warn('===== not sysUser=====')
        wx.hideHomeButton();// 隐藏左上角小房子
      }
      _that.setData({
        isSysUser,
        userId: userAccountId
      })
      _that.data.isDemandShareRead && _that.promoterFun({ isUserAccount, userAccountId, userUnregisteredAccountId });// 去执行分享阅读
    }).catch(error => {
      handleErrCode(error, 'none')
      wx.hideHomeButton();// 隐藏左上角小房子
    }).finally(() => {
    })
  },

  /**
   * 执行分享阅读请求
   */
  async promoterFun(params: {
    isUserAccount: number;
    userAccountId: string;
    userUnregisteredAccountId: string;
  }) {
    let _that = this;
    // 执行搜索函数
    let { task, wxCodes, shareAccountId } = this.data;
    // const {globalData: {currentReadUser = {}}} = getApp();
    this.setData({
      shareAccountId
    })
    await taskExecuteShareRead({
      taskId: task.id,// 任务id
      promoterAccountId: shareAccountId,// 发起人
      isUserAccount: params.isUserAccount,
      userAccountId: params.userAccountId,
      userUnregisteredAccountId: params.userUnregisteredAccountId,
      // chainIds: wxCodes,// 阅读人列表
      // readWxampCode: currentReadUser.code || DEFAULT_CODE,// 当前阅读人
    }).then(async (response) => {
      _that.handleData(response)
    }).catch(error => {
      console.warn('=====taskExecuteShareRead error=====' + error)
      handleErrCode(error, 'none')
      wx.hideHomeButton();// 隐藏左上角小房子
    }).finally(() => {
    })
  },

  /**
   * 处理分享阅读请求返回
   */
  handleData(res = {}) {
    this.setData({
      ShareReadData: JSON.stringify(res)
    })
    console.log(res.data);
    this.updateStatusTag(res.data)
    const { chainIds, isPromoterAccount } = res.data || {};
    this.setData({
      wxCodes: chainIds,
      isPromoterAccount,
    });
    if (this.startCountDownCheck()) {// 如果是发起人角色，去执行阅读任务操作
      this.tikTokFun();
    }
  },
  // 更新状态标签显示
  updateStatusTag(task) {
    let statusText = '';
    let statusTagClass = '';

    if (task.isQualification === 0) {
      statusText = '无执行资格';
      statusTagClass = 'tag-error';
    } else {
      switch (task.executeShareReadCode) {
        case 1:
          statusText = '执行成功';
          statusTagClass = 'tag-success';
          break;
        case 2:
          statusText = '无需执行';
          statusTagClass = 'tag-info';
          break;
        case 3:
          statusText = '已阅读过他人分享';
          statusTagClass = 'tag-warning';
          break;
        case 4:
          statusText = '重复执行';
          statusTagClass = 'tag-warning';
          break;
        case 5:
          statusText = '前置任务未完成';
          statusTagClass = 'tag-error';
          break;
        default:
          statusText = '待执行';
          statusTagClass = 'tag-info';
      }
    }

    this.setData({
      statusText,
      statusTagClass,
      showStatusTag: true
    });
  },
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {
    wx.showShareMenu({
      withShareTicket: true,
      menus: [
        'shareAppMessage', // 分享给朋友
        'shareTimeline',// 分享到朋友圈
      ]
    })
  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {
    return
  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage(options) {
    console.log('阅读分享', options)
    if (options.from === 'button') {
      console.log("来自页面内转发按钮");
      console.log(options.target);
    } else {
      console.log("来自右上角转发菜单")
    }
    let { wxCodes, url, shareAccountId, task } = this.data;
    const info = createShareAppMessageInfo(task, shareAccountId, wxCodes, 'pages/publicShareDetail/index', url)
    return {
      ...info,
      success: (res) => {
        console.log("转发成功", res);
      },
      fail: (res) => {
        console.log("转发失败", res);
      }
    }

  },
})